Intro

In this report we are focusing on the most frequented edges, all having more than 170 sessions along April 2016. All of this edges are around FEUP.

The data frame to use is: df_superhotedges_april16pt. It was created with the df df_speed_top which brings directly all points of the top edges from the database. The following filters were applied (more info: PreAnalysis_topedges.Rmd) Week days Hour between 8hr and 20h

Given a total of 9 variables, 9 edges, 1369 sessions and 190201 points. 
Half of the the sessions involve just one edge.  
1011 pass by Frei
150 sessions have gaps over 5min 
394 sessions have gaps over 2min 

Map with number of sessions

ms_3 <- m 
ms_3

Intersession time

Interpoint time

df_superhotedges_april16pt %>% 
  group_by(session_id) %>% 
  summarise(n = n_distinct(session_id))
  

  filter(way_id != 37141967) %>% 
  fgroup_by(session_id) %>% 
  summarise(speed = quantile(speed,0.9)) %>% 
  filter(speed == 0)

Temporal

df_sessions_allmodes %>% 
  filter(travelmode != "NA") %>% 
  group_by(hour = hour(time_start), travelmode) %>% 
  summarise(n_sessions = n_distinct(session_id)) %>% 
  ggplot(aes(x = hour,y = n_sessions, color=travelmode)) +
  geom_line() + 
  scale_x_continuous(breaks = seq(0,23,1)) + 
  theme_light()

Origin-Destination

External Factors(parking, etc)

df_superhotedges_april16pt %>% 
  filter((way_id == 37141967 & session_id == 47192))  %>% 
  plot_ly( x= ~time, y= ~track,color = ~factor(segment_id), type ="scatter")
No scatter mode specifed:
  Setting the mode to markers
  Read more about this attribute -> https://plot.ly/r/reference/#scatter-mode
No scatter mode specifed:
  Setting the mode to markers
  Read more about this attribute -> https://plot.ly/r/reference/#scatter-mode

Frei

Manuel Silva

df_superhotedges_april16pt %>% 
  filter(way_id == 35078500 & session_id == 19802)  %>% 
  plot_ly( x= ~time, y= ~speed,color = ~factor(way_id), type ="scatter", mode ="lines") 
minimal value for n is 3, returning requested palette with 3 different levels
minimal value for n is 3, returning requested palette with 3 different levels

Density

Rascunhos

df_superhotedges_april16pt %>% 
  filter((way_id == 37141967 & session_id == 47419))  %>% 
  plot_ly( x= ~time, y= ~track,color = ~factor(segment_id), type ="scatter")
No scatter mode specifed:
  Setting the mode to markers
  Read more about this attribute -> https://plot.ly/r/reference/#scatter-mode
No scatter mode specifed:
  Setting the mode to markers
  Read more about this attribute -> https://plot.ly/r/reference/#scatter-mode
df_superhotedges_april16pt %>% 
  filter(( session_id == 14249))  %>% 
  plot_ly( x= ~time, y= ~speed,color = ~factor(way_id), type ="scatter") 
No scatter mode specifed:
  Setting the mode to markers
  Read more about this attribute -> https://plot.ly/r/reference/#scatter-mode
minimal value for n is 3, returning requested palette with 3 different levels
No scatter mode specifed:
  Setting the mode to markers
  Read more about this attribute -> https://plot.ly/r/reference/#scatter-mode
minimal value for n is 3, returning requested palette with 3 different levels
df_hotedges_april16pt %>% 
  group_by(session_id) %>% 
  summarise(n = n_distinct(way_id)) %>% 
  filter(n > 5) %>% 
  arrange((n))

f <- df_edges_april16pt %>% 
  filter(session_id == 35307)


write.csv(f,"f.csv")
LS0tCnRpdGxlOiAiQUNNIHBvc3RlciAyMDE3IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKYXV0aG9yOiAiRGFuaWVsYSBTLiBHaWwiCi0tLQojIEludHJvIAoKSW4gdGhpcyByZXBvcnQgd2UgYXJlIGZvY3VzaW5nIG9uIHRoZSBtb3N0IGZyZXF1ZW50ZWQgZWRnZXMsIGFsbCBoYXZpbmcgbW9yZSB0aGFuIDE3MCBzZXNzaW9ucyBhbG9uZyAKQXByaWwgMjAxNi4gQWxsIG9mIHRoaXMgZWRnZXMgYXJlIGFyb3VuZCBGRVVQLiAKClRoZSBkYXRhIGZyYW1lIHRvIHVzZSBpczogZGZfc3VwZXJob3RlZGdlc19hcHJpbDE2cHQuCiAgICBJdCB3YXMgY3JlYXRlZCB3aXRoIHRoZSBkZiBkZl9zcGVlZF90b3Agd2hpY2ggYnJpbmdzIGRpcmVjdGx5IGFsbCBwb2ludHMgCiAgICBvZiB0aGUgdG9wIGVkZ2VzIGZyb20gdGhlIGRhdGFiYXNlLiAKICAgIFRoZSBmb2xsb3dpbmcgZmlsdGVycyB3ZXJlIGFwcGxpZWQgKG1vcmUgaW5mbzogUHJlQW5hbHlzaXNfdG9wZWRnZXMuUm1kKQogICAgICAqV2VlayBkYXlzCiAgICAgICpIb3VyIGJldHdlZW4gOGhyIGFuZCAyMGgKICAgICAgCiAgICBHaXZlbiBhIHRvdGFsIG9mIDkgdmFyaWFibGVzLCA5IGVkZ2VzLCAxMzY5IHNlc3Npb25zIGFuZCAxOTAyMDEgcG9pbnRzLiAKICAgIEhhbGYgb2YgdGhlIHRoZSBzZXNzaW9ucyBpbnZvbHZlIGp1c3Qgb25lIGVkZ2UuICAKICAgIDEwMTEgcGFzcyBieSBGcmVpCiAgICAxNTAgc2Vzc2lvbnMgaGF2ZSBnYXBzIG92ZXIgNW1pbiAKICAgIDM5NCBzZXNzaW9ucyBoYXZlIGdhcHMgb3ZlciAybWluIAoKCmBgYHtyIGVjaG89RkFMU0V9CiNDcmVhdGluZyBhIGRmIHdpdGggYWxsIHRoZSBwb2ludHMgaW4gdGhlIHNlc3Npb25zIHRoYXQgcGFzcyBieSBTSEUgCmRmX3N1cGVyaG90ZWRnZXNfYXByaWwxNnB0X2FsbCA8LSBkZl9lZGdlc19hcHJpbDE2cHQgJT4lIAogIGZpbHRlcihzZXNzaW9uX2lkICVpbiUgZGZfc3VwZXJob3RzZXNzaW9uc19hcHJpbDE2cHQpCgpgYGAKCmBgYHtyIGVjaG89RkFMU0V9CgpkZl9zdXBlcmhvdGVkZ2VzX2FwcmlsMTZwdCAgJT4lCiAgbWVyZ2UoZGZfZWRnZXNfYXByaWwxNnB0LCB1c2luZyA9IHNlc3Npb25faWQpICU+JSAKICBncm91cF9ieShzZXNzaW9uX2lkKSAlPiUKICBzdW1tYXJpc2UobiA9IG5fZGlzdGluY3Qod2F5X2lkKSkgJT4lIAogIGdncGxvdChhZXMobikpICsKICBnZW9tX2JhcihhZXMoZmlsbD1mYWN0b3IobikpKQoKYGBgCgpgYGB7ciBlY2hvPUZBTFNFfQpkZl9zdXBlcmhvdGVkZ2VzX2FwcmlsMTZwdCAgJT4lCiAgZ3JvdXBfYnkoc2Vzc2lvbl9pZCkgJT4lIAogIHN1bW1hcmlzZShuID0gbl9kaXN0aW5jdChzZWdtZW50X2lkKSkgJT4lIAogIGdncGxvdChhZXMobikpICsKICBnZW9tX2JhcihhZXMoZmlsbD1mYWN0b3IobikpKQoKYGBgCgojIE1hcCB3aXRoIG51bWJlciBvZiBzZXNzaW9ucwpgYGB7ciBlY2hvPUZBTFNFfQoKIyMjIyMjIyMjIyMgU2VsZWN0aW5nIGVkZ2VzIHRvIG1hcCAjIyMjIyMjIyMKCiMgQWxsIGVkZ2VzIChpbiBQb3J0bykgCmRmX3Nlc3Npb25zX2VkZ2VzX2FwcmlsMTZwdCA8LSBkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0ICU+JSAKICBncm91cF9ieSh3YXlfaWQpICU+JSAKICBzdW1tYXJpc2Uoc2Vzc2lvbnMgPSBuX2Rpc3RpbmN0KHNlc3Npb25faWQpKSAlPiUgCiAgbWVyZ2UoeT0gZGZfcG9pbnRzX2VkZ2Vfb3NtX2FwcmlsMTZwdCwgdXNpbmcgPSB3YXlfaWQpIAoKZGZfb3NtX2VkZ2UgPC0gZGZfc2Vzc2lvbnNfZWRnZXNfYXByaWwxNnB0ICU+JSAKICBzZWxlY3Qod2F5X2lkLCBzZXNzaW9ucykKCiMjIERpc2NyZXRpemF0aW9uIGJhc2VkIG9uIG51bWJlciBvZiBzZXNzaW9ucyAKZGZfc2Vzc2lvbnNfZWRnZXNfYXByaWwxNnB0IDwtIGRmX3Nlc3Npb25zX2VkZ2VzX2FwcmlsMTZwdCAlPiUgCiAgbXV0YXRlKGNhdGVnb3J5ID0gY2FzZV93aGVuKHNlc3Npb25zID4gMTU1IH4gIlNIRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25zID49IDUwICYgc2Vzc2lvbnMgPDE1NSB+ICJtZWRpdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9ucyA+IDI1ICYgc2Vzc2lvbnMgPCA1MCB+ICJsb3ciKSkKCgojIEhvdCBlZGdlcyAKZGZfb3NtX2VkZ2UgPC0gZGZfc2Vzc2lvbnNfZWRnZXNfYXByaWwxNnB0ICAlPiUgCiAgc3Vic2V0KHdheV9pZCAlaW4lIGRmX29zbV9lZGdlX2lkcyR3YXlfaWQpICU+JSAKICBzZWxlY3Qod2F5X2lkLCBzZXNzaW9ucykKCiMjIyMjIyMjIyBMaXN0IGJlZm9yZSBwYXNzaW5nIHRvIG1hcC4gIyMjIyMjIyMjCmxpc3Rfb3NtX2VkZ2UgPC0gZGZfb3NtX2VkZ2VbLCAxXQoKIyMjIyMjIyMjIyBNYXAgaW4gQXByaWwyMDE2LlJtZCAjIyMjIyMjIyMKYGBgCgpgYGB7cn0KbXNfMSA8LSBtCm1zXzEKbQpgYGAKCgpgYGB7cn0KIyBNYXAgd2l0aCBhbGwgcG9pbnRzIHdpdGggbsK6IHNlc3Npb25zCiMgICAgIGdyZWVuOiA8NTAsIDUwPCB5ZWxsb3cgPDE1NSwgcmVkID4gMTU1IAoKI21zXzMgPC0gbSAKbXNfMwpgYGAKCiMgSW50ZXJzZXNzaW9uIHRpbWUKCmBgYHtyIGVjaG89RkFMU0V9CiBkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0ICU+JSAKICBmaWx0ZXIoaW50ZXJzZXNzaW9uX3RpbWUgPiAwICkgJT4lIAogIG1lcmdlKGRmX3Nlc3Npb25zX2VkZ2VzX2FwcmlsMTZwdCwgdXNpbmcgPSB3YXlfaWQpICU+JSAKICBnZ3Bsb3QoIGFlcyh4PWludGVyc2Vzc2lvbl90aW1lLCBjb2xvciA9IGNhdGVnb3J5KSkrCiAgc2NhbGVfeF9sb2cxMChsaW1pdHMgPSBjKDFlMCwxZTQpLCBicmVha3MgPSBjKDEwLDMwLDYwLDEwMDApKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gMSAtIC4ueS4uKSwgc3RhdD0nZWNkZicpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiZ3JleSIsImJsdWUiLCJyZWQiLCJncmVlbiIpLAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKCJTSEUiLCAibWVkaXVtIiwgImxvdyIsIk5BIiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkhpZ2giLCAiTWVkaXVtIiwgIkxvdyIsIk5BIikpICsKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoIHNpemUgPSAyMCwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYygwLjgsMC44KSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIHNpemU9MjApLAogICAgICAgIGF4aXMudGV4dC54ICA9IGVsZW1lbnRfdGV4dChzaXplPTIwKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIHNpemU9MjApLAogICAgICAgIGF4aXMudGV4dC55ICA9IGVsZW1lbnRfdGV4dChzaXplPTIwKSwKICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAnd2hpdGUnLCBjb2xvdXIgPSAnYmxhY2snKSkgKwogICAgeGxhYigiSW50ZXJzZXNzaW9uIHRpbWUgKG1pbikiKSArIAogICAgeWxhYigiUChYPj14KSIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAgYygxNSwzMCw0NSw2MCksIGNvbG9yID0iZGFyayBncmV5IikgCiAgCmBgYAoKCmBgYHtyIGVjaG89RkFMU0V9CiBkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0ICU+JSAKICBmaWx0ZXIoaW50ZXJzZXNzaW9uX3RpbWUgPiAwICkgJT4lIAogIG1lcmdlKGRmX3Nlc3Npb25zX2VkZ2VzX2FwcmlsMTZwdCwgdXNpbmcgPSB3YXlfaWQpICU+JSAKICBnZ3Bsb3QoIGFlcyh4PWludGVyc2Vzc2lvbl90aW1lLCBjb2xvciA9IGNhdGVnb3J5KSkrCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcykgKwogIGdlb21fbGluZShhZXMoeSA9IDEgLSAuLnkuLiksIHN0YXQ9J2VjZGYnKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImdyZXkiLCJibHVlIiwicmVkIiwiZ3JlZW4iKSwKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygiU0hFIiwgIm1lZGl1bSIsICJsb3ciLCJOQSIpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJIaWdoIiwgIk1lZGl1bSIsICJMb3ciLCJOQSIpKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KCBzaXplID0gMjAsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC44LDAuOCksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBzaXplPTIwKSwKICAgICAgICBheGlzLnRleHQueCAgPSBlbGVtZW50X3RleHQoc2l6ZT0yMCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBzaXplPTIwKSwKICAgICAgICBheGlzLnRleHQueSAgPSBlbGVtZW50X3RleHQoc2l6ZT0yMCksCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gJ3doaXRlJywgY29sb3VyID0gJ2JsYWNrJykpICsKICAgIHhsYWIoIkludGVyc2Vzc2lvbiB0aW1lIChtaW4pIikgKyAKICAgIHlsYWIoIlAoWD49eCkiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gIGMoMTUsMzAsNDUsNjApLCBjb2xvciA9ImRhcmsgZ3JleSIpCgoKYGBgCgoKIyBJbnRlcnBvaW50IHRpbWUgCgpgYGB7ciBlY2hvPUZBTFNFfQojZGZfc3VwZXJob3RlZGdlc19hcHJpbDE2cHQkaW50ZXJwb2ludF90aW1lIDwtIE5VTEwKCiNkZl9zdXBlcmhvdGVkZ2VzX2FwcmlsMTZwdCA8LSAKICAKZGZfc3VwZXJob3RlZGdlc19hcHJpbDE2cHQgPC0gZGZfc3VwZXJob3RlZGdlc19hcHJpbDE2cHQgICU+JQogIGdyb3VwX2J5KHNlc3Npb25faWQpICU+JSAKICBhcnJhbmdlKHRpbWUpICU+JSAKICBtdXRhdGUoaW50ZXJwb2ludF90aW1lID0gYygwLGFzLm51bWVyaWMoZGlmZih0aW1lKSwgdW5pdHM9Im1pbnMiKSkpIApgYGAKCmBgYHtyfQpib3hwbG90KGUkaW50ZXJwb2ludF90aW1lLCB5bGltID0gYygwLDUwKSkKYGBgCgpgYGB7cn0KI0RpZmZlcmVudCBzZXNzaW9ucyB3aXRoIGludGVycG9pbnQgPiB4CmUgJT4lIAogIGZpbHRlcihpbnRlcnBvaW50X3RpbWUgPj0gMikgJT4lIAogIGNvdW50CmBgYAoKYGBge3J9CmRmX3N1cGVyaG90ZWRnZXNfYXByaWwxNnB0ICU+JSAKICBmaWx0ZXIoaW50ZXJwb2ludF90aW1lID4gMSkgJT4lIAogIGdncGxvdChhZXMoZmFjdG9yKHdheV9pZCksaW50ZXJwb2ludF90aW1lKSkgKwogIGdlb21fYm94cGxvdCgpICsgCiAgY29vcmRfY2FydGVzaWFuKHlsaW09IGMoMCw1MCkpCgpgYGAKCmBgYHtyfQpkZl9zdXBlcmhvdGVkZ2VzX2FwcmlsMTZwdCAlPiUgCiAgZ3JvdXBfYnkoc2Vzc2lvbl9pZCkgJT4lIAogIHN1bW1hcmlzZShuID0gbl9kaXN0aW5jdChzZXNzaW9uX2lkKSkKICAKCiAgZmlsdGVyKHdheV9pZCAhPSAzNzE0MTk2NykgJT4lIAogIGZncm91cF9ieShzZXNzaW9uX2lkKSAlPiUgCiAgc3VtbWFyaXNlKHNwZWVkID0gcXVhbnRpbGUoc3BlZWQsMC45KSkgJT4lIAogIGZpbHRlcihzcGVlZCA9PSAwKQpgYGAKCgojIFRlbXBvcmFsCgpgYGB7ciBlY2hvPUZBTFNFfQpkZl9lZGdlc19hcHJpbDE2cHQgJT4lCiAgbXV0YXRlKCBjYXRlZ29yeSA9IGNhc2Vfd2hlbih3YXlfaWQgJWluJSBkZl9vc21fZWRnZV9pZHMkd2F5X2lkIH4gIlNIRSIsIFRSVUUgfiAiQUxMIikpICU+JSAKICBncm91cF9ieShob3VyID1ob3VyKHRpbWUpLCBjYXRlZ29yeSkgJT4lIAogIHN1bW1hcmlzZShzZXNzaW9ucyA9IG5fZGlzdGluY3Qoc2Vzc2lvbl9pZCkpICU+JSAKICBnZ3Bsb3QoYWVzKGhvdXIsIHNlc3Npb25zLCBjb2xvciA9IGNhdGVnb3J5KSkgKyAKICBnZW9tX2xpbmUoKSsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsMjMsMSkpCmBgYAoKYGBge3IgZWNobz1GQUxTRX0KZGZfZWRnZXNfYXByaWwxNnB0ICU+JQogIG1lcmdlKGRmX3Nlc3Npb25zX2VkZ2VzX2FwcmlsMTZwdCwgdXNpbmcgPSB3YXlfaWQpICU+JSAKICBncm91cF9ieShob3VyID1ob3VyKHRpbWUpLCBjYXRlZ29yeSkgJT4lIAogIHN1bW1hcmlzZShzZXNzaW9ucyA9IG5fZGlzdGluY3Qoc2Vzc2lvbl9pZCkpICU+JSAKICBnZ3Bsb3QoYWVzKGhvdXIsIHNlc3Npb25zLCBjb2xvciA9IGNhdGVnb3J5KSkgKyAKICBnZW9tX2xpbmUoKSsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsMjMsMSkpCmBgYAoKYGBge3J9CmRmX3Nlc3Npb25zX2FsbG1vZGVzX2FwcmlsMTZwdCAlPiUgCiAgZ3JvdXBfYnkoaG91ciA9IGhvdXIodGltZV9zdGFydCkpICU+JSAKICBzdW1tYXJpc2Uobl9zZXNzaW9ucyA9IG5fZGlzdGluY3Qoc2Vzc2lvbl9pZCkpICU+JSAKICBwbG90X2x5KHg9fmZhY3Rvcihob3VyKSwgeT1+bl9zZXNzaW9ucywgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcycpCgpkZl9zZXNzaW9uc19hbGxtb2Rlc19hcHJpbDE2cHQgPC0gZGZfc2Vzc2lvbnNfYWxsbW9kZXNfYXByaWwxNnB0ICU+JSAKICBncm91cF9ieSh0cmF2ZWxtb2RlKSAlPiUgCiAgbXV0YXRlKHRvdGFsX3Nlc3Npb25zID0gbl9kaXN0aW5jdChzZXNzaW9uX2lkKSkKCmRmX3Nlc3Npb25zX2FsbG1vZGVzX2FwcmlsMTZwdCAlPiUgCiAgZmlsdGVyKHRyYXZlbG1vZGUgIT0gIk5BIikgJT4lIAogIGdyb3VwX2J5KGhvdXIgPSBob3VyKHRpbWVfc3RhcnQpLCB0cmF2ZWxtb2RlLCB0b3RhbF9zZXNzaW9ucykgJT4lIAogIHN1bW1hcmlzZShuX3Nlc3Npb25zID0gbl9kaXN0aW5jdChzZXNzaW9uX2lkKSkgJT4lIAogIG11dGF0ZShmcmVxID0gbl9zZXNzaW9ucy90b3RhbF9zZXNzaW9ucyAqMTAwKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gaG91cix5ID0gZnJlcSwgY29sb3I9dHJhdmVsbW9kZSkpICsKICBnZW9tX2xpbmUoKSArIAogIHlsYWIoIkZyZXF1ZW5jeSglKSIpICsKICB4bGFiKCJIb3VyIikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwyMywxKSkgKyAKICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShuYW1lID0gIlRyYXZlbG1vZGUiKSArCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBzaXplPTIwKSwKICAgICAgICBheGlzLnRleHQueCAgPSBlbGVtZW50X3RleHQoc2l6ZT0xNiksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBzaXplPTIwKSwKICAgICAgICBheGlzLnRleHQueSAgPSBlbGVtZW50X3RleHQoc2l6ZT0xNiksCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KCJTdHJlZXQiLCBzaXplPTE2LCBmYWNlPSJib2xkIiksIAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTYsIGZhY2U9ImJvbGQiKSwKICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAnd2hpdGUnLCBjb2xvdXIgPSAnYmxhY2snKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKDAuMiwwLjcpKQoKYGBgCgpgYGB7cn0KZGZfc2Vzc2lvbnNfYWxsbW9kZXMgJT4lIAogIGZpbHRlcih0cmF2ZWxtb2RlICE9ICJOQSIpICU+JSAKICBncm91cF9ieShob3VyID0gaG91cih0aW1lX3N0YXJ0KSwgdHJhdmVsbW9kZSkgJT4lIAogIHN1bW1hcmlzZShuX3Nlc3Npb25zID0gbl9kaXN0aW5jdChzZXNzaW9uX2lkKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IGhvdXIseSA9IG5fc2Vzc2lvbnMsIGNvbG9yPXRyYXZlbG1vZGUpKSArCiAgZ2VvbV9saW5lKCkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsMjMsMSkpICsgCiAgdGhlbWVfbGlnaHQoKQoKYGBgCgoKIyBPcmlnaW4tRGVzdGluYXRpb24gCgpgYGB7cn0KZGZfc3RfaG90ZWRnZXNfYXByaWwxNnB0IDwtIGRmX2hvdGVkZ2VzX2FwcmlsMTZwdFssLTJdICU+JSAKICBncm91cF9ieShzZXNzaW9uX2lkKSAlPiUKICBzbGljZSh3aGljaC5tYXgodGltZSkpICU+JSAKICBtdXRhdGUoZW5kID0gY2FzZV93aGVuKChsYXQgPiA0MS4xNzU2NDUgJiBsYXQgPCA0MS4xODA0ODEgJiBsb24gPiAtOC42MDcyMDAgJiBsb24gPCAtOC41ODYwOTMpIH4gIkZFVVAiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiT1VUIikpICAlPiUgCiAgcmVuYW1lKGMoIndheV9pZCI9IndheV9pZF9lbmQiLCJzZWdtZW50X2lkIj0ic2VnbWVudF9pZF9lbmQiLCAic2Vjb25kcyI9InNlY29uZHNfZW5kIiwibGF0IiA9ICJsYXRfZW5kIiwibG9uIiA9ICJsb25fZW5kIiwic3BlZWQiID0gInNwZWVkX2VuZCIsICJ0aW1lIj0idGltZV9lbmQiKSkgCiAgCmRmX3N0X2hvdGVkZ2VzX2FwcmlsMTZwdCA8LSBkZl9ob3RlZGdlc19hcHJpbDE2cHQgJT4lIAogIGdyb3VwX2J5KHNlc3Npb25faWQpICU+JQogIHNsaWNlKHdoaWNoLm1pbih0aW1lKSkgJT4lIAogIG11dGF0ZShzdGFydCA9IGNhc2Vfd2hlbigobGF0ID4gNDEuMTc1NjQ1ICYgbGF0IDwgNDEuMTgwNDgxICYgbG9uID4gLTguNjA3MjAwICYgbG9uIDwgLTguNTg2MDkzKSB+ICJGRVVQIiwgIAogICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIk9VVCIpKSAlPiUgCiAgcmVuYW1lKGMoIndheV9pZCI9IndheV9pZF9zdGFydCIsInNlZ21lbnRfaWQiPSJzZWdtZW50X2lkX3N0YXJ0IiwgInNlY29uZHMiPSJzZWNvbmRzX3N0YXJ0IiwibGF0IiA9ICJsYXRfc3RhcnQiLCJsb24iID0gImxvbl9zdGFydCIsInNwZWVkIiA9ICJzcGVlZF9zdGFydCIsICJ0aW1lIj0idGltZV9zdGFydCIpKSAlPiUgCiAgbWVyZ2UoeSA9IGRmX3N0X2hvdGVkZ2VzX2FwcmlsMTZwdCwgdXNpbmcgPSB3YXlfaWQpCgoKZGZfc3RfaG90ZWRnZXNfYXByaWwxNnB0IDwtIGRmX3N0X2hvdGVkZ2VzX2FwcmlsMTZwdCAlPiUgCiAgbXV0YXRlKGNsYXNzX3RyaXAgPSBjYXNlX3doZW4oKHN0YXJ0ID09ICJGRVVQIiAmIGVuZCA9PSAiT1VUIikgfiAxLAogICAgICAgICAgICAgICAgICAgIChzdGFydCA9PSAiT1VUIiAmIGVuZCA9PSAiRkVVUCIpIH4gMiwKICAgICAgICAgICAgICAgICAgICAoc3RhcnQgPT0gIk9VVCIgJiBlbmQgPT0gIk9VVCIpIH4gMywKICAgICAgICAgICAgICAgICAgICAoc3RhcnQgPT0gIkZFVVAiICYgZW5kID09ICJGRVVQIikgfiA0KSkgCgpkZl9zdF9ob3RlZGdlc19hcHJpbDE2cHQkY2xhc3NfdHJpcCA8LSBhcy5mYWN0b3IoZGZfc3RfaG90ZWRnZXNfYXByaWwxNnB0JGNsYXNzX3RyaXApCmRmX3N0X2hvdGVkZ2VzX2FwcmlsMTZwdCRlbmQgPC0gYXMuZmFjdG9yKGRmX3N0X2hvdGVkZ2VzX2FwcmlsMTZwdCRlbmQpCmRmX3N0X2hvdGVkZ2VzX2FwcmlsMTZwdCRzdGFydCA8LSBhcy5mYWN0b3IoZGZfc3RfaG90ZWRnZXNfYXByaWwxNnB0JHN0YXJ0KQpzdHIoZGZfc3RfaG90ZWRnZXNfYXByaWwxNnB0KQoKI0FsbCAgCmRmX3N0X2hvdGVkZ2VzX2FwcmlsMTZwdCAlPiUgCiAgbXV0YXRlKGNsYXNzX2RheSA9IGNhc2Vfd2hlbih3ZGF5KHRpbWVfc3RhcnQpIT0gMSAmICB3ZGF5KHRpbWVfc3RhcnQpIT0gNyB+ICJXZWVrZGF5IiwKICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiV2Vla2VuZCIpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWhvdXIodGltZV9zdGFydCkpKSArIAogIGdlb21fYmFyKGFlcyhmaWxsID0gY2xhc3NfdHJpcCApKSArIAogIHNjYWxlX2ZpbGxfaHVlKGJyZWFrcyA9IGMoIjEiLCAiMiIsICIzIiwiNCIpLAogICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkZyb20gY2FtcHVzIiwgIlRvIGNhbXB1cyIsICJPdXRzaWRlIGNhbXB1cyIsIldpdGhpbiBjYW1wdXMiKSkrCiAgIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dCggc2l6ZSA9IDIwLCBmYWNlID0gImJvbGQiKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKDAuNzUsMC44KSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIHNpemU9MjApLAogICAgICAgIGF4aXMudGV4dC54ICA9IGVsZW1lbnRfdGV4dChzaXplPTE2KSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIHNpemU9MjApLAogICAgICAgIGF4aXMudGV4dC55ICA9IGVsZW1lbnRfdGV4dChzaXplPTE2KSwKICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAnd2hpdGUnLCBjb2xvdXIgPSAnYmxhY2snKSkgKwogIHhsYWIoIkhvdXIiKSArIAogIHlsYWIoIiMgb2Ygc2Vzc2lvbnMiKSArCiAgZmFjZXRfZ3JpZCh+YXMuZmFjdG9yKGNsYXNzX2RheSkpICsgCiAgICAgICB0aGVtZShzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSkKCmBgYAoKYGBge3IgZWNobz1GQUxTRX0KIyBXZWVrIGRheXMgIApzdF93ZCA8LSBkZl9zdF9ob3RlZGdlc19hcHJpbDE2cHQgJT4lIAogIGZpbHRlcih3ZGF5KHRpbWVfc3RhcnQpIT0gMSwgIHdkYXkodGltZV9zdGFydCkhPSA3KSAlPiUgCiAgZ2dwbG90KGFlcyh4PWhvdXIodGltZV9zdGFydCkpKSArIAogIGdlb21fYmFyKGFlcyhmaWxsID0gY2xhc3NfdHJpcCApKSsKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoIHNpemUgPSAyMCwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYygwLjIsMC44KSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIHNpemU9MjApLAogICAgICAgIGF4aXMudGV4dC54ICA9IGVsZW1lbnRfdGV4dChzaXplPTE2KSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIHNpemU9MjApLAogICAgICAgIGF4aXMudGV4dC55ICA9IGVsZW1lbnRfdGV4dChzaXplPTE2KSwKICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAnd2hpdGUnLCBjb2xvdXIgPSAnYmxhY2snKSkgKwogIHhsYWIoIkhvdXIiKSArIAogIHlsYWIoIk7CuiBzZXNzaW9ucyIpCgpgYGAKCmBgYHtyIGVjaG89RkFMU0V9CiMgV2Vla2VuZApzdF93ZSA8LSBkZl9zdF9ob3RlZGdlc19hcHJpbDE2cHQgJT4lIAogIGZpbHRlcih3ZGF5KHRpbWVfc3RhcnQpPT0gMSB8IHdkYXkodGltZV9zdGFydCk9PSA3KSAlPiUgCiAgZ2dwbG90KGFlcyh4PWhvdXIodGltZV9zdGFydCkpKSArIAogIGdlb21fYmFyKGFlcyhmaWxsID0gY2xhc3NfdHJpcCApKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KCBzaXplID0gMjAsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC4zLDAuOCksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBzaXplPTIwKSwKICAgICAgICBheGlzLnRleHQueCAgPSBlbGVtZW50X3RleHQoc2l6ZT0xNiksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBzaXplPTIwKSwKICAgICAgICBheGlzLnRleHQueSAgPSBlbGVtZW50X3RleHQoc2l6ZT0xNiksCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gJ3doaXRlJywgY29sb3VyID0gJ2JsYWNrJykpICsKICB4bGFiKCJIb3VyIikgKyAKICB5bGFiKCJOwrogc2Vzc2lvbnMiKQoKbXVsdGlwbG90KHN0X3dkLCBzdF93ZSwgY29scyA9IDIpCmBgYAoKCiMgRXh0ZXJuYWwgRmFjdG9ycyhwYXJraW5nLCBldGMpCgpgYGB7cn0KZGZfc3VwZXJob3RlZGdlc19hcHJpbDE2cHQgJT4lIAogIGZpbHRlcih3YXlfaWQgPT0gMzcxNDE5NjcsIGRheSh0aW1lKSA9PSAyMCkgICU+JSAKICBncm91cF9ieSh3YXlfaWQsIHNlc3Npb25faWQsIHNlZ21lbnRfaWQpICU+JSAKICBzdW1tYXJpc2UoaXFyID0gSVFSKHRyYWNrKSkgCgpkZl9zdXBlcmhvdGVkZ2VzX2FwcmlsMTZwdCAlPiUgCiAgZmlsdGVyKCh3YXlfaWQgPT0gMzcxNDE5NjcgJiBzZXNzaW9uX2lkID09IDE4MDY4NDcxOTIpKSAgJT4lIAogIHBsb3RfbHkoIHg9IH50aW1lLCB5PSB+dHJhY2ssY29sb3IgPSB+ZmFjdG9yKHNlZ21lbnRfaWQpLCB0eXBlID0ic2NhdHRlciIpCgpgYGAKCiMjIEZyZWkgIAoKYGBge3J9CmRmX3N1cGVyaG90ZWRnZXNfYXByaWwxNnB0ICU+JSAKICBmaWx0ZXIod2F5X2lkID09IDM3MTQxOTY3KSAgJT4lIAogIGdyb3VwX2J5KHdheV9pZCwgc2Vzc2lvbl9pZCkgJT4lIAogIHN1bW1hcmlzZShpcXIgPSBJUVIodHJhY2spLCBtX3NwZWVkID0gbWVkaWFuKHNwZWVkKSwgYXZnX3NwZWVkID0gbWVhbihzcGVlZCkpICU+JSAKICBmaWx0ZXIobV9zcGVlZCA8IGF2Z19zcGVlZCAsIGlxciA+IDEwMCkKCmBgYAoKYGBge3J9CmYzIDwtIGRmX3N1cGVyaG90ZWRnZXNfYXByaWwxNnB0ICU+JSAKICBmaWx0ZXIoIHNlc3Npb25faWQgPT0gMTU3NykgICU+JSAKICBwbG90X2x5KCB4PSB+dGltZSwgeT0gfnRyYWNrLGNvbG9yID0gfmZhY3RvcihzZWdtZW50X2lkKSwgdHlwZSA9InNjYXR0ZXIiLCBtb2RlID0gImxpbmVzIikKCmY0IDwtIGRmX3N1cGVyaG90ZWRnZXNfYXByaWwxNnB0ICU+JSAKICBmaWx0ZXIoIHNlc3Npb25faWQgPT0gMTU3NykgICU+JSAKICBwbG90X2x5KCB4PSB+dGltZSwgeT0gfnNwZWVkLGNvbG9yID0gfmZhY3Rvcih3YXlfaWQpLCB0eXBlID0ic2NhdHRlciIsIG1vZGUgPSJsaW5lcyIpIAoKc3VicGxvdChmMyxmNCwgbnJvd3MgPSAyKQoKc3VicGxvdChmMSxmMiwgbnJvd3MgPSAyKQoxNTc3CmBgYAoKIyMgTWFudWVsIFNpbHZhCgpgYGB7cn0KZGZfc3VwZXJob3RlZGdlc19hcHJpbDE2cHQgJT4lIAogIGZpbHRlcih3YXlfaWQgPT0gMzUwNzg1MDApICAlPiUgCiAgZ3JvdXBfYnkod2F5X2lkLCBzZXNzaW9uX2lkKSAlPiUgCiAgc3VtbWFyaXNlKGlxciA9IElRUih0cmFjayksIG1fc3BlZWQgPSBtZWRpYW4oc3BlZWQpLCBhdmdfc3BlZWQgPSBtZWFuKHNwZWVkKSkgJT4lIAogIGZpbHRlcihtX3NwZWVkIDwgYXZnX3NwZWVkICwgaXFyID4gMTAwKQoKYGBgCgpgYGB7cn0KIGRmX3N1cGVyaG90ZWRnZXNfYXByaWwxNnB0ICU+JSAKICBmaWx0ZXIoKHdheV9pZCA9PSAzNTA3ODUwMCAmIHNlc3Npb25faWQgPT0gMTk4MDIpKSAgJT4lIAogIHBsb3RfbHkoIHg9IH50aW1lLCB5PSB+dHJhY2ssY29sb3IgPSB+ZmFjdG9yKHNlZ21lbnRfaWQpLCB0eXBlID0ic2NhdHRlciIsIG1vZGUgPSAibGluZXMiKQpgYGAKCgpgYGB7cn0KZGZfc3VwZXJob3RlZGdlc19hcHJpbDE2cHQgJT4lIAogIGZpbHRlcih3YXlfaWQgPT0gMzUwNzg1MDAgJiBzZXNzaW9uX2lkID09IDE5ODAyKSAgJT4lIAogIHBsb3RfbHkoIHg9IH50aW1lLCB5PSB+c3BlZWQsY29sb3IgPSB+ZmFjdG9yKHdheV9pZCksIHR5cGUgPSJzY2F0dGVyIiwgbW9kZSA9ImxpbmVzIikgCmBgYAoKIyMgRGVuc2l0eQpgYGB7cn0KZGZfc3VwZXJob3RlZGdlc19hcHJpbDE2cHQgJT4lIAogIGZpbHRlciggd2F5X2lkID09IDM1MDc4NTAwIHwgd2F5X2lkID09IDM3MTQxOTY3IHwgd2F5X2lkID09IDM2OTc5MjI4KSAlPiUgCiAgZ2dwbG90KGFlcyh4PSB0cmFjaykpICsKICBnZW9tX2RlbnNpdHkoYWVzKGdyb3VwPWZhY3Rvcih3YXlfaWQpLCBjb2xvcj1mYWN0b3Iod2F5X2lkKSkpICsKICB4bGFiKCJHcmFkZXMowropIikgKwogIHlsYWIoIkRlbnNpdHkiKSAlPiUgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYyg5MCwyNzApLGNvbG9yID0gImdyZXkiKSArIAogIHNjYWxlX2NvbG9yX2Rpc2NyZXRlKG5hbWUgPSAiU3RyZWV0IiwKICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKCIzNTA3ODUwMCIsICIzNzE0MTk2NyIsICIzNjk3OTIyOCIpLAogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIjEiLCAiMiIsICIzIikpICsKICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIHNpemU9MjApLAogICAgICAgIGF4aXMudGV4dC54ICA9IGVsZW1lbnRfdGV4dChzaXplPTE2KSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIHNpemU9MjApLAogICAgICAgIGF4aXMudGV4dC55ICA9IGVsZW1lbnRfdGV4dChzaXplPTE2KSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoIlN0cmVldCIsIHNpemU9MTYsIGZhY2U9ImJvbGQiKSwgCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xNiwgZmFjZT0iYm9sZCIpLAogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICd3aGl0ZScsIGNvbG91ciA9ICdibGFjaycpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC4xLDAuOCkpCiAgCiAgCmBgYAoKIAojIyBSYXNjdW5ob3MgCgpgYGB7cn0KZGZfc3VwZXJob3RlZGdlc19hcHJpbDE2cHQgJT4lIAogIGZpbHRlcigod2F5X2lkID09IDM3MTQxOTY3ICYgc2Vzc2lvbl9pZCA9PSA0NzQxOSkpICAlPiUgCiAgbWVyZ2UoZGZfb3NtX2VkZ2VfaWRzLCB1c2luZyA9d2F5X2lkKSAlPiUgCiAgcGxvdF9seSggeD0gfnRpbWUsIHk9IH50cmFjayxjb2xvciA9IH5mYWN0b3Ioc2VnbWVudF9pZCksIHR5cGUgPSJzY2F0dGVyIikKCmBgYAoKYGBge3J9CmRmX3N1cGVyaG90ZWRnZXNfYXByaWwxNnB0ICU+JSAKICBmaWx0ZXIoKCBzZXNzaW9uX2lkID09IDE0MjQ5KSkgICU+JSAKICBwbG90X2x5KCB4PSB+dGltZSwgeT0gfnNwZWVkLGNvbG9yID0gfmZhY3Rvcih3YXlfaWQpLCB0eXBlID0ic2NhdHRlciIpIAoKbG9uZ19zZXNzaW9ucyA8LSBjKDExNzEyLDE5OTA0LDExMjczLDg1ODQwLCA4MzIsMzgyNywgODUwNTcsIDQ4MTgyKQpgYGAKCgpgYGB7cn0KZGZfaG90ZWRnZXNfYXByaWwxNnB0ICU+JSAKICBncm91cF9ieShzZXNzaW9uX2lkKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuX2Rpc3RpbmN0KHdheV9pZCkpICU+JSAKICBmaWx0ZXIobiA+IDUpICU+JSAKICBhcnJhbmdlKChuKSkKCmYgPC0gZGZfZWRnZXNfYXByaWwxNnB0ICU+JSAKICBmaWx0ZXIoc2Vzc2lvbl9pZCA9PSAzNTMwNykKCgp3cml0ZS5jc3YoZiwiZi5jc3YiKQpgYGAKCmBgYHtyIGVjaG89RkFMU0V9CmRmX3N1cGVyaG90ZWRnZXNfYXByaWwxNnB0ICU+JSAKICBmaWx0ZXIoIHdheV9pZCA9PSAzNTA3ODUwMCApICU+JSAKICBtZXJnZSh5ID0gZGZfb3NtX2VkZ2VfaWRzLCB1c2luZyA9IHdheV9pZCkgJT4lIAogIApgYGAKCgoKCgo=